#pragma once

#include "log.hpp"
#include <iostream>
#include <vector>
#include <cstring>
#include <string>
#include <cstdio>
#include <jsoncpp/json/json.h>

#define IPPORT "Host: 8.130.28.2:8081"

#define CRLF "\r\n"
#define CRLF_LEN strlen(CRLF)
#define SPACE " "
#define SPACE_LEN strlen(SPACE)

// 用于指定服务器的根目录(服务器用来存储和提供静态文件的位置)
const std::string root_path = "./wwwroot";
const std::string home_page = "index.html";

// 分割请求消息
void PackageSplit(std::string &inbuffer, std::vector<std::string> *result)
{
    // 找到GET请求末尾
    std::size_t pos = inbuffer.find(IPPORT);
    if(pos == std::string::npos)
    {
        LogMessage(FATAL, "GET not find");
    }

    // 分割GET请求
    result->push_back(inbuffer.substr(0, pos));
    // 获得GET请求后清空缓冲区
    inbuffer.clear();
}

// 请求
struct Request
{
    std::string path; // 请求路径
};

// 响应
struct Response
{
    std::string html_string; // 保存html信息
    std::string json_string; // 搜索到的json字符串
};

bool Parser(const std::string &in, Request *req)
{
    // http请求第一行是请求行, 获取第一行内容
    std::size_t pos = in.find(CRLF);
    if(pos == std::string::npos) return false;
    std::string request_line = in.substr(0, pos);

    // 第一行格式 GET /url HTTP/1.1
    // GET /s?word=filesystem HTTP/1.1
    // 获取url
    std::size_t first = request_line.find(SPACE);
    if(pos == std::string::npos) return false;
    std::size_t second = request_line.rfind(SPACE);
    if(pos == std::string::npos) return false;

    std::string page = request_line.substr(first + SPACE_LEN, second - (first + SPACE_LEN));
    // 如果是/ , 表示请求的主页面, 需要加上默认的请求路径/index.html
    if(page.size() == 1 && page[0] == '/') page += home_page;
    // 加上服务器的根目录
    req->path = root_path + page;

    return true;
}